﻿#pragma once

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include "headers.h"
#include "Gwiazda.h"
#include "Planeta.h"

#include "Camera.h"
#include "resource.h"
#include "Swiatlo.h"
#include "Kometa.h"
#include "Punkt.h"
#include "Czasteczka.h"




class Glowna /// Główna klasa programu. Odpowiada za przepływ sterowania jak i obsługę zdarzeń klawiatury (poruszanie się w przestrzeni)
{
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//														%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//							PRIVATE
//														%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
private:	
//#################################################################################################################
//                   uchwyty różnego typu
//#################################################################################################################
	HWND              g_hWnd        ;		///< główny uchwyt okna
	LPDIRECT3D9       g_pD3D        ;		///< główny uchwyt dx

	LPD3DXMATRIXSTACK g_matrixStack ;		///< główna macierz	
	cCamera *camera;						///< kamera
	ID3DXFont * gFont;						///< wskaznik na czcionke
	const int kFontSize;					///< rozmiar czcionki

		  
//#################################################################################################################
//                   zmienne merytoryczne
//#################################################################################################################
	Czasteczka vrcCzasteczki[4000];			///< tablica cząsteczek dla łuny Słońca
	static const int ile_swiatel = 14;		///< ilosc zrodel swiatla w poblizu Slonca	
	float  g_fElpasedTime;					///< czas opoznienia chyba
	double g_dCurrentTime;					///< obecny czas
	double g_dLastTime;						///< poprzedni pobrany czas
//#################################################################################################################
//                   deklaracje zmiennych wskazujacych na realne obiekty
//#################################################################################################################
	Gwiazda *sun; ///< wskaźnik na obiekt Gwiazdy
	Planeta *Venus; ///< wskaźnik na obiekt planety
	Planeta *Merkury; ///< wskaźnik na obiekt planety
	Planeta *Ziemia; ///< wskaźnik na obiekt planety
	Planeta *Mars; ///< wskaźnik na obiekt planety
	Planeta *Jowisz; ///< wskaźnik na obiekt planety
	Planeta *Saturn; ///< wskaźnik na obiekt planety
	Planeta *Uran; ///< wskaźnik na obiekt planety
	Planeta *Neptun; ///< wskaźnik na obiekt planety
	Kometa *Haleya; ///< wskaźnik na obiekt komety

	Czasteczka  czasteczka1, czasteczka2, czasteczka3;	///< obiekty klasy czasteczka
	LPDIRECT3DTEXTURE9 dymTex; ///< obiekt struktury odpowiadającej za teksturowanie


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//														%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//							PUBLIC
//														%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
public:
//#################################################################################################################
//                   zmienne globalne
//#################################################################################################################	
	static float g_fSpeedmodifier;			///< modyfikator predkosci
	static bool  g_bOrbitOn;				///< czy ruch po orbicie włączony (można zatrzymać ruch w Układzie Słonecznym)

//#################################################################################################################
//                   konstruktor bezargumentowy
//#################################################################################################################
	Glowna(void);	///< konstruktor bezargumentowy - zeruje wszystkie obiekty zawierające się w klasie Glowna

//#################################################################################################################
//                   destruktor
//#################################################################################################################
	~Glowna(void); ///< destruktor

//#################################################################################################################
//                   na poczastku bylo WINAPI
//#################################################################################################################	
	int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow); ///< główna metoda klasy odpowiadająca za przepływ sterowania

//#################################################################################################################
//                   świetna nie wiadomo co robiaca funkcja
//#################################################################################################################	
	static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); ///< zdarzeniowa metoda odpowiadająca za przyjmowanie zdarzeń od klawiatury i odpowiednią reakcję na nie

//#################################################################################################################
//                   funkcja inicjujaca
//#################################################################################################################	
	void init(void); ///< metoda inicjująca wszystkie obiekty zawierające się w klasie Glowna

//#################################################################################################################
//                   funkcja sprzątająca
//#################################################################################################################	
	void shutDown(void); ///< funkcja sprzątająca - usuwa z pamięci wszystkie utworzone obiekty

//#################################################################################################################
//                   funkcja wyświetlająca obraz
//#################################################################################################################	
	void render(void); ///< metoda przygotowująca scenę (klatkę) animacji i wyświetlająca ją na ekranie

//#################################################################################################################
//                   funkcja przekształcająca promien
//#################################################################################################################	
	void przeksztalcPromien(D3DXMATRIX* mMatrix, D3DXVECTOR3* eyeIn,  D3DXVECTOR3* eyeOut,  
							D3DXVECTOR3* lookAtIN,  D3DXVECTOR3* lookAtOut); ///< funkcja realizuje przekształcenia wektorowe które obejmują przekształcenia wektorów położenia kamery oraz punktu na który w danej chwili jest skierowana kamera. Zostały one zaimplementowane w celu badania kolizji wyżej wymienionych wektorów z obiektami planet aby móc wypisać o nich informacje edukacyjne.
};
